library(reshape2)
library(dplyr)
library(tidyr)
library(knitr)
library(ggplot2)
library(plotly)
library(corrplot)
library(shiny)
library(reshape)
library(caret)
df <- read.csv("sledzie.csv",header=TRUE,colClasses = c("integer","numeric","numeric","numeric","numeric","numeric","numeric","numeric","numeric","numeric","numeric","numeric","numeric","numeric","integer","numeric"),na.strings = "?")
df <- data.frame(df)
df_no_na <- na.omit(df)
raw_df <- df
for (i in 1:ncol(df)){df[is.na(df[,i]),i] <- mean(df[,i],na.rm = T)}
nrows <- nrow(df)
ncols <- ncol(df)
complete_rows <- sum(complete.cases(raw_df))
n_na_rows <- nrows - complete_rows
Zbiór danych zawiera 16 atrybutów opisujących 52582 obserwacji. W zbiorze znajdują się 10094 niekompletnych obserwacji.
Atrybuty w zbiorze danych:
length - długość złowionego śledzia [cm]
cfin1 - dostępność planktonu [zagęszczenie Calanus finmarchicus gat. 1]
cfin2 - dostępność planktonu [zagęszczenie Calanus finmarchicus gat. 2]
chel1 - dostępność planktonu [zagęszczenie Calanus helgolandicus gat. 1]
chel2 - dostępność planktonu [zagęszczenie Calanus helgolandicus gat. 2]
lcop1 - dostępność planktonu [zagęszczenie widłonogów gat. 1]
lcop2 - dostępność planktonu [zagęszczenie widłonogów gat. 2]
fbar - natężenie połowów w regionie [ułamek pozostawionego narybku]
recr - roczny narybek [liczba śledzi]
cumf - łączne roczne natężenie połowów w regionie [ułamek pozostawionego narybku]
totaln - łączna liczba ryb złowionych w ramach połowu [liczba śledzi]
sst - temperatura przy powierzchni wody [°C]
sal - poziom zasolenia wody [Knudsen ppt]
xmonth - miesiąc połowu [numer miesiąca]
nao - oscylacja północnoatlantycka [mb]
kable(summary(raw_df), caption = "Podsumowanie zbioru danych")
| X | length | cfin1 | cfin2 | chel1 | chel2 | lcop1 | lcop2 | fbar | recr | cumf | totaln | sst | sal | xmonth | nao | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Min. : 0 | Min. :19.0 | Min. : 0.0000 | Min. : 0.0000 | Min. : 0.000 | Min. : 5.238 | Min. : 0.3074 | Min. : 7.849 | Min. :0.0680 | Min. : 140515 | Min. :0.06833 | Min. : 144137 | Min. :12.77 | Min. :35.40 | Min. : 1.000 | Min. :-4.89000 | |
| 1st Qu.:13145 | 1st Qu.:24.0 | 1st Qu.: 0.0000 | 1st Qu.: 0.2778 | 1st Qu.: 2.469 | 1st Qu.:13.427 | 1st Qu.: 2.5479 | 1st Qu.:17.808 | 1st Qu.:0.2270 | 1st Qu.: 360061 | 1st Qu.:0.14809 | 1st Qu.: 306068 | 1st Qu.:13.60 | 1st Qu.:35.51 | 1st Qu.: 5.000 | 1st Qu.:-1.89000 | |
| Median :26291 | Median :25.5 | Median : 0.1111 | Median : 0.7012 | Median : 5.750 | Median :21.673 | Median : 7.0000 | Median :24.859 | Median :0.3320 | Median : 421391 | Median :0.23191 | Median : 539558 | Median :13.86 | Median :35.51 | Median : 8.000 | Median : 0.20000 | |
| Mean :26291 | Mean :25.3 | Mean : 0.4458 | Mean : 2.0248 | Mean :10.006 | Mean :21.221 | Mean : 12.8108 | Mean :28.419 | Mean :0.3304 | Mean : 520367 | Mean :0.22981 | Mean : 514973 | Mean :13.87 | Mean :35.51 | Mean : 7.258 | Mean :-0.09236 | |
| 3rd Qu.:39436 | 3rd Qu.:26.5 | 3rd Qu.: 0.3333 | 3rd Qu.: 1.7936 | 3rd Qu.:11.500 | 3rd Qu.:27.193 | 3rd Qu.: 21.2315 | 3rd Qu.:37.232 | 3rd Qu.:0.4560 | 3rd Qu.: 724151 | 3rd Qu.:0.29803 | 3rd Qu.: 730351 | 3rd Qu.:14.16 | 3rd Qu.:35.52 | 3rd Qu.: 9.000 | 3rd Qu.: 1.63000 | |
| Max. :52581 | Max. :32.5 | Max. :37.6667 | Max. :19.3958 | Max. :75.000 | Max. :57.706 | Max. :115.5833 | Max. :68.736 | Max. :0.8490 | Max. :1565890 | Max. :0.39801 | Max. :1015595 | Max. :14.73 | Max. :35.61 | Max. :12.000 | Max. : 5.08000 | |
| NA | NA | NA’s :1581 | NA’s :1536 | NA’s :1555 | NA’s :1556 | NA’s :1653 | NA’s :1591 | NA | NA | NA | NA | NA’s :1584 | NA | NA | NA |
uniq <- raw_df %>% summarise_each(funs(n_distinct(., na.rm = TRUE)))
## Warning: funs() is soft deprecated as of dplyr 0.8.0
## Please use a list of either functions or lambdas:
##
## # Simple named list:
## list(mean = mean, median = median)
##
## # Auto named with `tibble::lst()`:
## tibble::lst(mean, median)
##
## # Using lambdas
## list(~ mean(., trim = .2), ~ median(., na.rm = TRUE))
## This warning is displayed once per session.
kable(uniq, caption = "Unikalne wartości")
| X | length | cfin1 | cfin2 | chel1 | chel2 | lcop1 | lcop2 | fbar | recr | cumf | totaln | sst | sal | xmonth | nao |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 52582 | 59 | 39 | 48 | 48 | 51 | 48 | 51 | 51 | 52 | 52 | 53 | 51 | 51 | 12 | 45 |
| # Rozkła | d wartośc | i atrybu | tów |
boxplot(df_no_na$length, horizontal = TRUE, main="Długość złowionego śledzia [cm]")
boxplot(df_no_na[,3:8], main="Dostępność planktonu",
names=c("Calanus finmarchicus", "Calanus finmarchicus", "Calanus helgolandicus", "Calanus helgolandicus", "widłonogi", "widłonogi"))
boxplot(df_no_na$fbar, horizontal=TRUE, main="Natężenie połowów w regionie")
boxplot(df_no_na$recr, horizontal=TRUE, main="Roczny narybek")
boxplot(df_no_na$cumf, horizontal=TRUE, main="Łączne roczne natężenie połowów w regionie")
boxplot(df_no_na$totaln, horizontal=TRUE, main="Łączna liczba ryb złowionych w ramach połowu")
boxplot(df_no_na$sst, horizontal=TRUE, main="Temperatura przy powierzchni wody")
boxplot(df_no_na$sal, horizontal=TRUE, main="Poziom zasolenia wody")
boxplot(df_no_na$nao, horizontal=TRUE, main="Oscylacja północnoatlantycka")
Brakujące wartości występują tylko w 7 atrybutach:
- dostępność planktonu -> cfin1, cfin2, chel1, chel2, lcop1, lcop2,
- temperatura przy powierzchni wody -> sst.
correlation <- cor(df)
corrplot(correlation,type="upper",tl.col = "black", tl.srt = 45)
partition <- createDataPartition(y=raw_df$length, p=.05, list=FALSE)
dfPartition <- raw_df[partition, ]
p <- ggplot(dfPartition, aes(x=X, y=length)) + geom_point() + geom_smooth() + theme_bw()
ggplotly(p)
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'
Sekcję próbującą stworzyć regresor przewidujący rozmiar śledzia (w tej sekcji należy wykorzystać wiedzę z pozostałych punktów oraz wykonać dodatkowe czynności, które mogą poprawić trafność predykcji); dobór parametrów modelu oraz oszacowanie jego skuteczności powinny zostać wykonane za pomocą techniki podziału zbioru na dane uczące, walidujące i testowe; trafność regresji powinna zostać oszacowana na podstawie miar R2 i RMSE.
Dane zostały podzielone na 2 zbiory: zbiór treningowy - zawierający 80 % danych, oraz zbiór testowy - zawierający 20 % danych.
inTraining <- createDataPartition(y=df$length,p=.8,list = F)
training <- df[inTraining]
testing <- df[-inTraining]
10.Analizę ważności atrybutów najlepszego znalezionego modelu regresji. Analiza ważności atrybutów powinna stanowić próbę odpowiedzi na pytanie: co sprawia, że rozmiar śledzi zaczął w pewnym momencie maleć.